package clases
import org.scalatest.junit.AssertionsForJUnit
import org.junit.Assert._
import org.junit.Test
import org.junit.Before
import mixins._
import excepciones._
import scala.collection.mutable.ArrayBuffer

class TestRecepcion extends AssertionsForJUnit {
  var reservaA: Reserva = _
  var reservaB: Reserva = _
  var reservaC: Reserva = _
  var reservaD: Reserva = _
  var canchaConLuces: Cancha with Alquilable = _
  var canchaConTribunaParaFutbol: Cancha with Alquilable = _
  var canchaTipoPaddleConTecho: Cancha with Alquilable = _
  var canchas: ArrayBuffer[Cancha with Alquilable] = _

  var recepcion: Recepcion = _

  @Before def initialize() {
    reservaA = new Reserva(1, 16, 17, new Cliente { monedero = 6000 })
    reservaB = new Reserva(1, 17, 18, new Cliente { monedero = 6000 })
    reservaC = new Reserva(1, 18, 19, new Cliente { monedero = 6000 })
    reservaD = new Reserva(2, 16, 18, new Cliente { monedero = 6000 })

    canchaConLuces = new Cancha with Alquilable with TipoTenis with ConLuces
    canchaConLuces.numero = 1
    canchaConTribunaParaFutbol = new Cancha with TipoFutbol with ConTribuna { jugadores = 10 }
    canchaConTribunaParaFutbol.numero = 2
    canchaTipoPaddleConTecho = new Cancha with Alquilable with TipoPaddle with ConTecho
    canchaTipoPaddleConTecho.numero = 3

    canchas = ArrayBuffer[Cancha with Alquilable](canchaConLuces, canchaConTribunaParaFutbol, canchaTipoPaddleConTecho)
    recepcion = new Recepcion(canchas)
  }

  @Test def testCanchaConMasReservas() {
    canchaConLuces.reservatePara(reservaA)
    canchaConLuces.reservatePara(reservaB)
    canchaConLuces.reservatePara(reservaC)

    canchaConTribunaParaFutbol.reservatePara(reservaA)
    canchaConTribunaParaFutbol.reservatePara(reservaB)

    canchaTipoPaddleConTecho.reservatePara(reservaA)

    assertTrue(recepcion.canchaConMasReservas.numero == 1)
  }
  
  @Test def canchasSinLucesReservaNocturna() {
    canchaConTribunaParaFutbol.reservatePara(reservaC)
    
  }

  @Test def canchasQueTienenReservasUnDia() {
    canchaConLuces.reservatePara(reservaA)
    canchaConTribunaParaFutbol.reservatePara(reservaA)
    canchaTipoPaddleConTecho.reservatePara(reservaD)

    assertTrue(recepcion.queCanchasTienenReservasElDia(1).size == 2)

    //me fijo si lo que hay dentro del arrayBuffer es una cancha
    assertEquals(recepcion.queCanchasTienenReservasElDia(1).head, canchaConLuces)
  }

  @Test def reservasParaElDia() {
    canchaConLuces.reservatePara(reservaA)
    canchaConLuces.reservatePara(reservaD)

    canchaConTribunaParaFutbol.reservatePara(reservaA)
    canchaConTribunaParaFutbol.reservatePara(reservaD)

    canchaTipoPaddleConTecho.reservatePara(reservaA)
    canchaTipoPaddleConTecho.reservatePara(reservaD)

    assertTrue(recepcion.reservasParaElDia(1).size == 3)
  }

  @Test def facturacionTotal() {

    var facturacion: Double = 00
    canchas.foreach(a => facturacion = facturacion + a.tuPrecio(reservaA))
    canchas.foreach(a => facturacion = facturacion + a.tuPrecio(reservaB))
    canchas.foreach(a => facturacion = facturacion + a.tuPrecio(reservaC))

    canchas.foreach(a => a.reservatePara(reservaA))
    canchas.foreach(a => a.reservatePara(reservaB))
    canchas.foreach(a => a.reservatePara(reservaC))

    //el metodo llueve del trait ConTecho es random, en este caso puede dar una diferencia de 10
    assertEquals(facturacion, recepcion.calcularFacturacionTotal, 10)
  }

}